#include "Int_LED.h"

/**
 * @brief LED 初始化
 *
 */
void Int_LED_Init(void)
{
    // 1. 时钟使能 GPIOA, RCC_APB2ENR 寄存器中的 IOPAEN 控制位置 1，
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    // 2. GPIO模式设置, 将PA0、PA1、PA8设置成通用推挽输出; CNF=00,MODE=11
    // 设置 PA0、PA1
    GPIOA->CRL &= ~(GPIO_CRL_CNF0 | GPIO_CRL_CNF1);
    GPIOA->CRL |= (GPIO_CRL_MODE0 | GPIO_CRL_MODE1);
    // 设置 PA8
    GPIOA->CRH &= ~GPIO_CRH_CNF8;
    GPIOA->CRH |= GPIO_CRH_MODE8;

    // 3. 默认熄灭3个LED(引脚置1)
    GPIOA->ODR |= (LED1 | LED2 | LED3);
}

/**
 * @brief 点亮指定的LED
 *
 * @param led 指定的LED
 */
void Int_LED_On(uint16_t led)
{
    GPIOA->ODR &= ~led;
}

/**
 * @brief 熄灭指定的LED
 *
 * @param led 指定的LED
 */
void Int_LED_Off(uint16_t led)
{
    GPIOA->ODR |= led;
}

/**
 * @brief 切换指定LED的状态
 *
 * @param led 指定的LED
 */
void Int_LED_Toggle(uint16_t led)
{
    // 如果当前的LED是熄灭的，点亮
    if (GPIOA->ODR & led)
    {
        GPIOA->ODR &= ~led;
    }
    // 如果当前的LED是点亮的，熄灭
    else
    {
        GPIOA->ODR |= led;
    }
}

/**
 * @brief 点亮多个LED
 *
 * @param leds 多个LED组成的数组
 * @param len LED数量
 */
void Int_LED_OnAll(uint16_t *leds, uint8_t len)
{
    for (uint8_t i = 0; i < len; i++)
    {
        GPIOA->ODR &= ~leds[i];
    }
}

/**
 * @brief 熄灭多个LED
 *
 * @param leds 多个LED组成的数组
 * @param len  LED数量
 */
void Int_LED_OffAll(uint16_t *leds, uint8_t len)
{
    for (uint8_t i = 0; i < len; i++)
    {
        GPIOA->ODR |= leds[i];
    }
}
